[JDBC #2] 순수 JDBC 이해하기

[Java Application] --(URL, USERNAME, PASSWORD)--> [DriverManager] --> [Connection] --> [DB]

DriverManager에 접속 정보(URL, 계정)를 넘기면 매번 새로운 Connection을 생성해 DB와 연결한다. (커넥션 풀 없이 요청마다 연결/해제)

DB와 연결하기

  • JDBC는 DB를 연결시켜주는 인터페이스 이므로, DB에 접근하기 위한 정보들이 필요하다
  • DB의 주소 (Ex: URL), DB 접근 계정 정보 (Ex: ID / PASSWORD)들이 필요하다
  • DriverManager 혹은 DataSource를 사용 (DriverManager를 활용한 JDBC를 사용해보고자 한다.)

DriverManager의 장단점

장점단점
단순하고 직관적이다커넥션 풀 미지원 (매번 DB 연결/해제)
외부 의존 없이 동작매번 연결/닫기를 수동으로 처리해야 한다
JDBC 표준 API이므로 범용성 있음트랜잭션, 커넥션 재사용 등 고급 기능 부족

DriverManager의 경우, 간단하거나 순수 JDBC를 연습할때는 사용할만하지만 커넥션을 매번 맺고 끊어야하기에 리소스 낭비가 발생할 수 있으므로 사용시에 충분한 고려가 필요하다 (커넥션 풀 미지원)

DriverManger 사용법

public DBUtil{
//...
public static Connection getConnection(){
    return DriverManager.getConnection(
            ConnectionConst.URL,
            ConnectionConst.USERNAME,
            ConnectionConst.PASSWORD);
}
}
  • DB의 주소 (URL), DB 접근계정(USERNAME, PASSWORD)를 파라미터로 넘기면 DB와 연결을 시도한다.

JDBC 기본 구조

  1. Connection : DB연결을 위한 자바 인터페이스
  2. PreparedStatement  : sql 구문 정의
  3. ResultSet  : DB 결과 응답 값 저장
Connection con = null; // DB 연결
    PreparedStatement pstmt = null; // SQL 구문 
    ResultSet rs = null; // 결과값
 
try{
    con = DBUtil.getConnection(URL, USERNAME, PASSWORD);
    pstmt = con.prepareStatement("sql구문");
    pstmt.setString() // sql에 필요한 인자값 셋팅
    pstmt.executeUpdate() // 쿼리 실행
}
catch ( SQLException e ){
    // ...
}
finally{
 
     if(rs != null) rs.close();
     if(pstmt != null) pstmt.close(); 
     if(con != null) con.close(); 
 }

JDBC  사용 방법

  1. Connection 사용 방법
  • DriverManager를 사용 (DB와 연결)
       Ex) DriverManager.getConnection( URL, USERNAME, PASSWORD); 
  1. PrepareStateMent 사용 방법
  • setXXX :  String, int, Array, Blob … 등 여러가지 데이터 타입을 지정하여 SQL 인자로 넣을 수 있다.
       Ex) prepareStatement.setString(1, member.getName());

  • executeXXX..() : SQL 실행 메서드 ( 반환값 유무에 따라 다른 메서드를 사용 )
        Ex) executeUpdate() : 결과값 없이 SQL 구문 실행 ( Insert, Update, Delete ..)
        Ex) executeQuery() : 결과값이 있는(ResultSet이 존재하는) SQL 구문 실행 (SELECT) 

  1. ResultSet 사용 방법
  • 사용 방식 : 원하는 객체형태로 역직렬화과정이 필요
  • 추출 방식 : index 혹은 Label 정보를 통한 값 추출 가능
  • ResultSet의 경우, 반복문을 통해 row 한개씩 찾으며, 값을 추출한다.

JDBC 예제

public void save(Member member) throws SQLException{
    try{
        con = DBConnectionUtil.getConnection();
        pstmt = con.prepareStatement("INSERT INTO MEMBER(name, age, addr) VALUES (?,?,?)");
        pstmt.setString(1, member.getName());
        pstmt.setInt(2, member.getAge());
        pstmt.setString(3, member.getAddr());
        pstmt.executeUpdate();
    }catch (SQLException e){
        log.error("[JDBC] save() error {}",e.getMessage());
        throw new RuntimeException("save() error!", e);
    }finally{
        if(rs != null) rs.close();
        if(pstmt != null) pstmt.close();
        if(con != null) con.close();
    }
 
}
 
public List<Member> findAll() throws SQLException{
    try{
        con = DBConnectionUtil.getConnection();
        pstmt = con.prepareStatement("SELECT name, age, addr FROM MEMBER");
        rs = pstmt.executeQuery();
        List<Member> result = new ArrayList<>();
        while(rs.next()){
            Member member = new Member();
            member.setName(rs.getString("name"));
            member.setAge(rs.getInt("age"));
            member.setAddr(rs.getString("addr"));
            result.add(member);
        }
 
        return result;
    }catch(SQLException e){
        throw new RuntimeException("findAll() Error!");
    }finally {
        if(rs != null) rs.close();
        if(pstmt != null) pstmt.close();
        if(con!= null )con.close();
    }
 
}